11. 类函数声明

类函数

要在 Matrix 类中编写函数,首先需要声明这些函数。对于 Matrix 类,你可以将这些函数看作属于三个独立的类别:

  • 构造函数
  • set 和 get 函数
  • Matrix 功能函数

声明这些函数的方法和前一课中声明函数一样。不同的是,现在你必须决定某个函数是私有的、受保护的还是公共的。函数声明在类声明内部。

你需要在 matrix.cpp 中定义你的函数。但首先,让我们简要地谈一下每种类型的函数。构造函数用于初始化对象。Python 使用 def __init__ 语法实现这一功能。C++ 语法有点不同,你将在本课的下一部分中了解这些差异。

set 和 get 取函数专门用于访问和赋值给私有变量。因为一个对象不能直接访问私有变量,set 和 get 函数提供了间接访问功能。set 和 get 函数的语法和其他 C++ 函数相同。使用 set 和 get 是面向对象编程的惯例,而不是特定的 C++ 语法。

最后,还有一些由矩阵功能组成的函数,如打印矩阵、矩阵相加、矩阵乘法等等。在练习中,你会执行这些函数。

下面,我们进入到下一部分的练习,学习如何声明和定义 Matrix 构造函数。

Set 和 Get 函数声明

Set 和 Get 函数允许你的对象访问私有变量。对象不能直接访问私有变量,所以需要使用 set 和 get 函数。本课前面的 Gaussian 对象展示了具体实现方法。

以下是 set 和 get 函数的声明:

class Gaussian
{
    private:
        ...

    public:
        ...

        void setMu(float);
        void setSigma2(float);

        float getMu();
        float getSigma2();

     ....
};

set 函数改变一个变量的值,而 get 函数则返回一个变量的值。你会注意到,set 和 get 函数的语法与所有常规函数都是一样的。实际上,set 和 get 是约定,而不是 C++ 特有的。传统上,我们将这些函数命名为 getVariablename() 和 setVariablename(),虽然没有明确要求。

你需要将 set 和 get 函数声明为公共的,以便对象可以访问这些函数。

Set 函数

为什么 set 函数返回一个空值?

SOLUTION:
  • set 函数只改变一个变量的值。
  • 空的返回类型意味着函数不返回任何内容。

矩阵功能函数

第三组要声明的函数是用于矩阵功能的。其语法与 get 和 set 函数语法以及任何正常的 C++ 函数完全相同。你需要为输入变量指定返回数据类型、函数名称和数据类型。

例如,Gaussian 类有三个函数:evaluate、multiply 和 add。以下是如何在 gaussian.h 文件中声明这些函数的示范:

class Gaussian
{
    ....

    public:

       ...

        //待评估函数 
        float evaluate (float);
        Gaussian multiply (Gaussian);
        Gaussian add (Gaussian);
};

在 Matrix 类中声明函数

现在,轮到你在 matrix.h 文件中声明函数了。在下面的 matrix.h 文件中填充 TODO 部分。答案在代码下面。

Start Quiz:

#include <vector>

class Matrix 
{

        private:

            std::vector< std::vector<float> > grid;
            std::vector<float>::size_type rows;
            std::vector<float>::size_type cols;
            
        public:
        
        /* 
        ** TODO: Declare  constructor functions
        ** For the matrix class, you will need two constructor functions.
        ** 1. An empty constructor function
        ** 2. A constructor function that accepts a 2-dimensional vector
        */
        
        /*
        ** TODO: Declare set and get functions for the three private variables.
        ** You will need 1 set function and 3 get functions.
        ** The names of these functions should be setGrid, getGrid, getRows, 
        ** and getCols.
        **
        ** The setGrid does not return anything and has a 2-D vector input
        ** getGrid returns a 2-D vector and has no input
        ** getRows returns a size_type and has no input
        ** get Cols returns a size_type and has no input
        */
        
        /*
        ** TODO: Declare the matrix functions. In a following exercise, you
        ** will program matrix_transpose, matrix_addition and matrix_print
        ** functions. So you will need to declare these two functions.
        ** 
        ** matrix_transpose has no input and outputs a 2D vector
        ** matrix_addition receives a Matrix and outputs a 2D vector
        ** matrix_print has no inputs and no outputs
        */
};
        
#include "matrix.h"

/* TODO: Define the default constructor. Remember the syntax is
**      Classname::ClassName() {
**    
**          initialize variables
**    
**       }
**
**
**      You need to initialize the grid variable to a default value such as
**      a 4x4 matrix with all zeros.
**
**      Then initialize the rows variable, and the cols variable using the
**      vector size method. For example myvector.size() will give the size of
**      a vector. For a 2-dimensional vector, myvector.size() would be the
**      number of rows in a matrix.
**
*/

/* TODO: Define a constructor that receives a 2-Dimensional vector
**       and assigns the vector to the grid variable. 
**       
**      Remember the syntax is
**      Classname::ClassName(datatype inputvariablename) {
**    
**          classvariable = inputvariablename
**    
**       }
**
**      Then initialize the rows variable, and the cols variable exactly
**      as you did for the default constructor.
**
*/
#include <iostream>
#include <vector>
#include "matrix.h"

int main () {
    
    // TODO: Nothing to do here
    
    return 0;
}

参考答案

# include <vector>

class Matrix 
{

        private:

            std::vector< std::vector<float> > grid;
            std::vector<int>::size_type rows;
            std::vector<int>::size_type cols;

        public:

            // constructor function declarations
            矩阵
            Matrix (std::vector< std::vector<float> >);

            // set and get function declarations
            void setGrid(std::vector< std::vector<float> >);

            std::vector< std::vector<float> > getGrid();
            std::vector<int>::size_type getRows();
            std::vector<int>::size_type getCols();

            // matrix function declarations
            std::vector< std::vector<float> > matrix_transpose();
            std::vector< std::vector<float> > matrix_addition(Matrix);
            void matrix_print();  
};

定义函数

在下一节中,你将在 matrix.cpp 文件中定义所有这些函数。